'use strict'
require('babel-register')
require('dotenv').config() // 获取环境变量
const Wechat = require('./src/wechat.js')
const fs = require('fs')
const { isAtRobot, isGroupChat } = require('./src/util')
const {
  GAME_KEYS,
  // CHENG_YU_JIE_LONG,
  BU_GUA,
  JIN_RI_YUN_SHI,
  CHA_HUANG_LI,
  SHUI_SHI_WO_DI,
  LING_QUAN
} = require('./config')
// const { default: IdiomSolitailre } = require('./src/game/IdiomSolitailre')
const { default: Divination } = require('./src/game/Divination')
const { default: Chat } = require('./src/game/Chat')
const { handleNormalChat } = require('./src/game/Chat/helper.js')
const { default: handleInit } = require('./src/init/index.js')
const { default: Constellation } = require('./src/game/Constellation/index.js')
const { default: Calendar } = require('./src/game/Calendar/index.js')
const { default: Undercover } = require('./src/game/Undercover/index.js')
const { default: TakeawayCoupon } = require('./src/game/TakeawayCoupon/index.js')

// 游戏实例
const GAME_CLASS = {
  default: Chat,
  // [CHENG_YU_JIE_LONG]: IdiomSolitailre,
  [BU_GUA]: Divination,
  [JIN_RI_YUN_SHI]: Constellation,
  [CHA_HUANG_LI]: Calendar,
  [SHUI_SHI_WO_DI]: Undercover,
  [LING_QUAN]: TakeawayCoupon
}

let bot, startTime
/**
 * 尝试获取本地登录数据，免扫码
 * 这里演示从本地文件中获取数据
 */
try {
  bot = new Wechat(require('./sync-data.json'))
} catch (e) {
  bot = new Wechat()
}
handleInit(bot)
/**
 * 登录成功事件
 */
bot.on('login', () => {
  startTime = Date.now()
  // 保存数据，将数据序列化之后保存到任意位置
  fs.writeFileSync('./sync-data.json', JSON.stringify(bot.botData))
})

// 每个群独立环境,游戏服务数据结构 serverMap <msg.FromUserName,  {key, instance}>
const serverMap = new Map()
// 监听游戏退出
bot.on('exitGame', userName => {
  serverMap.set(userName, null)
})

bot.on('message', msg => {
  // 历史记录消息不回复
  if (startTime > msg.getTime()) return
  let currentContact // 当前发消息的人
  if (isGroupChat(msg.FromUserName)) {
    const contactUserName = msg.OriginalContent.split(':')[0]
    currentContact = bot.contacts[msg.FromUserName].MemberList.find(
      item => item.UserName === contactUserName
    )
  } else {
    currentContact = bot.contacts[msg.FromUserName]
  }
  const msgContent = msg.Content // 对话内容
  const botNickName = bot.botData.user.NickName // 机器人名称
  // console.log(JSON.stringify(msg))
  console.log(JSON.stringify(currentContact), msgContent)
  let currentEnv = serverMap.get(msg.FromUserName)
  // 默认聊天
  if (!currentEnv) {
    currentEnv = {
      key: 'default',
      instance: new Chat()
    }
    serverMap.set(msg.FromUserName, currentEnv)
  }
  /**
   * 判断消息类型
   */
  switch (msg.MsgType) {
    // 文本消息
    case bot.CONF.MSGTYPE_TEXT:
      const divideIndex = msgContent.indexOf(':')
      const originContent = msgContent.slice(divideIndex + 1)
      let content = originContent.replace(`@${botNickName}`, '').trim()

      if (isGroupChat(msg.FromUserName)) {
        // 判断@机器人
        if (isAtRobot(botNickName, msgContent)) {
          try {
            if (currentEnv.key !== 'default') {
              bot.sendMsg(`${botNickName}现在很忙碌，勿扰！`, msg.FromUserName)
              return
            }
            const gameReg = new RegExp(`\\s?(.*?)(${GAME_KEYS.join('|')})(.*)`)
            if (gameReg.test(content)) {
              const gameExecList = gameReg.exec(content) // 获取匹配结果['天蝎座今日运势', '天蝎座', '今日运势', '', index: 0, input: '天蝎座今日运势', groups: undefined]
              const gameKey = gameExecList[2]
              if (gameKey === currentEnv.key) return // 如果已经在某个功能中直接返回
              let GameClass = GAME_CLASS[gameKey]
              currentEnv = {
                key: gameKey,
                instance: new GameClass(bot)
              }
              serverMap.set(msg.FromUserName, currentEnv)
              currentEnv.instance.init({bot, msg, currentContact, gameExecList, botNickName})
            }

            if (currentEnv.key === 'default') {
              bot.sendMsg(`非菜单功能，当前只支持\n${GAME_KEYS.join(' | ')}`, msg.FromUserName)
            }
          } catch (err) {
            bot.emit('error', err)
          }
        } else if (currentEnv && currentEnv.key === 'default') {
        // 正常聊天模式
          handleNormalChat({bot, msg, currentEnv, currentContact, content, botNickName})
        } else if (
          GAME_KEYS.includes(currentEnv.key) &&
        currentEnv.instance.run
        ) {
        // 判断是否是群聊，在游戏中
          currentEnv.instance.run({bot, msg, content, currentContact, botNickName})
        }
      } else {
        // 单聊
        bot
          .sendMsg('目前不支持单聊功能，请联系开发者！', msg.FromUserName)
          .catch(err => {
            bot.emit('error', err)
          })
      }

      break
    // case bot.CONF.MSGTYPE_IMAGE:
    //   /**
    //    * 图片消息
    //    */
    //   console.log('图片消息，保存到本地')
    //   bot.getMsgImg(msg.MsgId).then(res => {
    //     fs.writeFileSync(`./media/${msg.MsgId}.jpg`, res.data)
    //   }).catch(err => {
    //     bot.emit('error', err)
    //   })
    //   break
    // case bot.CONF.MSGTYPE_VOICE:
    //   /**
    //    * 语音消息
    //    */
    //   console.log('语音消息，保存到本地')
    //   bot.getVoice(msg.MsgId).then(res => {
    //     fs.writeFileSync(`./media/${msg.MsgId}.mp3`, res.data)
    //   }).catch(err => {
    //     bot.emit('error', err)
    //   })
    //   break
    // case bot.CONF.MSGTYPE_EMOTICON:
    //   /**
    //    * 表情消息
    //    */
    //   console.log('表情消息，保存到本地')
    //   bot.getMsgImg(msg.MsgId).then(res => {
    //     fs.writeFileSync(`./media/${msg.MsgId}.gif`, res.data)
    //   }).catch(err => {
    //     bot.emit('error', err)
    //   })
    //   break
    // case bot.CONF.MSGTYPE_VIDEO:
    // case bot.CONF.MSGTYPE_MICROVIDEO:
    //   /**
    //    * 视频消息
    //    */
    //   console.log('视频消息，保存到本地')
    //   bot.getVideo(msg.MsgId).then(res => {
    //     fs.writeFileSync(`./media/${msg.MsgId}.mp4`, res.data)
    //   }).catch(err => {
    //     bot.emit('error', err)
    //   })
    //   break
    // case bot.CONF.MSGTYPE_APP:
    //   if (msg.AppMsgType == 6) {
    //     /**
    //      * 文件消息
    //      */
    //     console.log('文件消息，保存到本地')
    //     bot.getDoc(msg.FromUserName, msg.MediaId, msg.FileName).then(res => {
    //       fs.writeFileSync(`./media/${msg.FileName}`, res.data)
    //       console.log(res.type);
    //     }).catch(err => {
    //       bot.emit('error', err)
    //     })
    //   }
    //   break
    default:
      break
  }
})

/**
 * 登出成功事件
 */
bot.on('logout', () => {
  console.log('登出成功')
  // 清除数据
  fs.unlinkSync('./sync-data.json')
})

